package es.uma.scgt.controlador;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import es.uma.scgt.autenticacion.UserDetailsImpl;
import es.uma.scgt.dao.EquipoDao;
import es.uma.scgt.dao.PeticionDao;
import es.uma.scgt.dao.TareaDao;
import es.uma.scgt.dao.UsuarioDao;
import es.uma.scgt.dto.GraficaPorFechaDto;
import es.uma.scgt.modelo.Equipo;
import es.uma.scgt.modelo.Historico;
import es.uma.scgt.modelo.Peticion;
import es.uma.scgt.modelo.Tarea;
import es.uma.scgt.modelo.Usuario;

@Controller
public class RendimientoControlador {

	private static final String PARAM_PETI_RECI = "nPetRecibidas";
	private static final String PARAM_TAREA_PEND = "nTPendientes";
	private static final String PARAM_TAREA_DESARROLLO = "nTareaDesarrollo";
	private static final String PARAM_TAREA_TEST = "nTTest";
	private static final String PARAM_TAREA_HOY = "nTHoy";

	private static final String PARAM_TAREA_FIN_HOY_USUARIO = "nTareasFHoy";
	private static final String PARAM_TAREA_FIN_SEMANA_USUARIO = "nTareasFSemana";
	private static final String PARAM_TAREA_DES_SEMANA_USUARIO = "nTareasDSemana";
	private static final String PARAM_TAREA_TES_SEMANA_USUARIO = "nTareasTSemana";

	private static final String PARAM_TAREA_ENTRE_FECHAS = "nTareasEntre";
	private static final String PARAM_TAREA_ENTRE_FECHASEQUIPO = "nTareasEntreE";
	private static final String PARAM_DESDE = "fDesde";
	private static final String PARAM_HASTA = "fHasta";

	private static final String PARAM_TAREA_FIN_HOY_EQUIPO = "nTFinHoyE";
	private static final String PARAM_TAREA_FIN_SEMANA_EQUIPO = "nTFinSemanaE";

	private static final String DATA = "data";
	private static final String SERIES = "series";
	private static final String TITULO = "titulo";
	private static final String DESCRIPCION = "descripcion";
	private static final String TIPOSERIE = "tipoSerie";
	private static final String YDESCRIPCION = "yDescripcion";

	@Autowired
	private EquipoDao equipoDao;
	@Autowired
	private TareaDao tareaDao;
	@Autowired
	private UsuarioDao usuarioDao;
	@Autowired
	private PeticionDao peticionDao;

	@RequestMapping("/CrudRendimiento")
	@Transactional
	public String iniCrudRendimiento(ModelMap model) {

		UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		listaUsuarios.add(usuarioDao.encuentraUsuarioPorId(userDetails.getUsuarioId()));
	
		model.addAttribute(PARAM_TAREA_FIN_HOY_USUARIO, tareaDao.getTareaFinHoy(listaUsuarios).size());
		model.addAttribute(PARAM_TAREA_FIN_SEMANA_USUARIO, tareaDao.getTareaFinSemana(listaUsuarios).size());
//		model.addAttribute(PARAM_TAREA_DES_SEMANA_USUARIO, tareaDao.getTareaDesSemana(listaUsuarios).size());
//		model.addAttribute(PARAM_TAREA_TES_SEMANA_USUARIO, tareaDao.getTareaTesSemana(listaUsuarios).size());

		return "CrudRendimiento";
	}

	@RequestMapping("/TFinEntreFechas")
	@Transactional
	public String TFinEntreFechas(ModelMap model, @RequestParam("fDesde") String fDesde, @RequestParam("fHasta") String fHasta) {

		UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		listaUsuarios.add(usuarioDao.encuentraUsuarioPorId(userDetails.getUsuarioId()));

		Date fDesdeDate;
		Date fHastaDate;

		try {
			if (fDesde != null && !fDesde.isEmpty()) {
				fDesdeDate = new SimpleDateFormat("dd/MM/yyyy").parse(fDesde);
			} else {
				fDesdeDate = null;
			}
			if (fHasta != null && !fHasta.isEmpty()) {
				fHastaDate = new SimpleDateFormat("dd/MM/yyyy").parse(fHasta);
			} else {
				fHastaDate = null;
			}

		} catch (ParseException e) {
			e.printStackTrace();
			fDesdeDate = null;
			fHastaDate = null;
		}

		model.addAttribute(PARAM_TAREA_ENTRE_FECHAS, tareaDao.getTareaEntreFechas(listaUsuarios, fDesdeDate, fHastaDate).size());
		model.addAttribute(PARAM_DESDE, fDesdeDate);
		model.addAttribute(PARAM_HASTA, fHastaDate);
		model.addAttribute(PARAM_DESDE+ "String", fDesde);
		model.addAttribute(PARAM_HASTA+ "String", fHasta);
		

		return iniCrudRendimiento(model);
	}

//Boton Ok Equipo
	
	@RequestMapping("/TFinEntreFechasE")
	@Transactional
	public String TFinEntreFechasE(ModelMap model, @RequestParam("fDesde") String fDesde, @RequestParam("fHasta") String fHasta) {

		UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		List<Equipo> listaEquipos = userDetails.getListaEquipos();
		List<Integer> listaEquipoId = new ArrayList<Integer>();


		// Numero de tareas pendiente
		for (Equipo equipo : listaEquipos) {
			listaEquipoId.add(equipo.getId());
		}

		List<Integer> listaUsuarioId = equipoDao.usuariosXEquipo(listaEquipoId);
		List<Usuario> usuarios = new ArrayList<Usuario>();
		for (Integer usuarioId : listaUsuarioId) {
			Usuario usuarioItem = new Usuario();
			usuarioItem.setId(usuarioId);
			usuarios.add(usuarioItem);
		}
		
		Date fDesdeDate;
		Date fHastaDate;

		try {
			if (fDesde != null && !fDesde.isEmpty()) {
				fDesdeDate = new SimpleDateFormat("dd/MM/yyyy").parse(fDesde);
			} else {
				fDesdeDate = null;
			}
			if (fHasta != null && !fHasta.isEmpty()) {
				fHastaDate = new SimpleDateFormat("dd/MM/yyyy").parse(fHasta);
			} else {
				fHastaDate = null;
			}

		} catch (ParseException e) {
			e.printStackTrace();
			fDesdeDate = null;
			fHastaDate = null;
		}

		model.addAttribute(PARAM_TAREA_ENTRE_FECHASEQUIPO, tareaDao.getTareaEntreFechas(usuarios, fDesdeDate, fHastaDate).size());
		model.addAttribute(PARAM_DESDE, fDesdeDate);
		model.addAttribute(PARAM_HASTA, fHastaDate);
		

		return iniCrudRendimientoEquipo(model);
	}


	@RequestMapping("/CrudRendimientoEquipo")
	@Transactional
	public String iniCrudRendimientoEquipo(ModelMap model) {
		
		//Por aqui
		
	
	UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
	List<Equipo> listaEquipos = userDetails.getListaEquipos();
		List<Integer> listaEquipoId = new ArrayList<Integer>();


		// Numero de tareas pendiente
		for (Equipo equipo : listaEquipos) {
		listaEquipoId.add(equipo.getId());
		}

    	List<Integer> listaUsuarioId = equipoDao.usuariosXEquipo(listaEquipoId);
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		for (Integer usuarioId : listaUsuarioId) {
			Usuario usuarioItem = new Usuario();
			usuarioItem.setId(usuarioId);
			listaUsuarios.add(usuarioItem);
		}


		model.addAttribute(PARAM_TAREA_FIN_HOY_EQUIPO, tareaDao.getTareaFinHoy(listaUsuarios).size());
		model.addAttribute(PARAM_TAREA_FIN_SEMANA_EQUIPO, tareaDao.getTareaFinSemana(listaUsuarios).size());

		return "CrudRendimientoEquipo";
	}

	@RequestMapping("/Resumen")
	@Transactional
	public String resumen(ModelMap model) {

		UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		List<Equipo> listaEquipos = userDetails.getListaEquipos();
		List<Integer> listaEquipoId = new ArrayList<Integer>();

		// Numero de peticiones recibidas mi equipo
		List<Peticion> listapeticiones = peticionDao.pEquiposxUsuario(listaEquipos);
		model.addAttribute(PARAM_PETI_RECI, listapeticiones.size());

		// Numero de tareas pendiente
		for (Equipo equipo : listaEquipos) {
			listaEquipoId.add(equipo.getId());
		}

		List<Integer> listaUsuarioId = equipoDao.usuariosXEquipo(listaEquipoId);
		List<Usuario> usuarios = new ArrayList<Usuario>();
		for (Integer usuarioId : listaUsuarioId) {
			Usuario usuarioItem = new Usuario();
			usuarioItem.setId(usuarioId);
			usuarios.add(usuarioItem);
		}

		model.addAttribute(PARAM_TAREA_PEND, tareaDao.getTareaPendienteMiEquipo(usuarios).size());

		// Numero Mis Tareas en Desarrollo y Test
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		listaUsuarios.add(usuarioDao.encuentraUsuarioPorId(userDetails.getUsuarioId()));
		model.addAttribute(PARAM_TAREA_DESARROLLO, tareaDao.getTareaDesarrolloMiEquipo(listaUsuarios).size());
		model.addAttribute(PARAM_TAREA_TEST, tareaDao.getTareaTestMiEquipo(listaUsuarios).size());
		model.addAttribute(PARAM_TAREA_HOY, tareaDao.getFechaFinHoy(listaUsuarios).size());
		return "partes/Resumen";
	}

	@RequestMapping("/rendimientoUsuario")
	@Transactional
	public String rendimientoUsuario(ModelMap model,@RequestParam(required = false, value = "fDesde") String fDesde, @RequestParam(required = false, value = "fHasta") String fHasta) {

		UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		listaUsuarios.add(usuarioDao.encuentraUsuarioPorId(userDetails.getUsuarioId()));

		Map<String, GraficaPorFechaDto> mapaGraficaUsuario = new HashMap<String, GraficaPorFechaDto>();
		
		if (fDesde != null && !fDesde.isEmpty()){
			
			Date fDesdeDate;
			Date fHastaDate;

			try {
				if (fDesde != null && !fDesde.isEmpty()) {
					fDesdeDate = new SimpleDateFormat("dd/MM/yyyy").parse(fDesde);
				} else {
					fDesdeDate = null;
				}
				if (fHasta != null && !fHasta.isEmpty()) {
					fHastaDate = new SimpleDateFormat("dd/MM/yyyy").parse(fHasta);
				} else {
					fHastaDate = null;
				}

			} catch (ParseException e) {
				e.printStackTrace();
				fDesdeDate = null;
				fHastaDate = null;
			}
			
			mapaGraficaUsuario = tareaDao.getTareaParaGraficaIntervalo(listaUsuarios,fDesdeDate,fHastaDate);
		}else{
			mapaGraficaUsuario = tareaDao.getTareaParaGrafica(listaUsuarios);
		}
		
		
		List<GraficaPorFechaDto> listaData = new ArrayList<GraficaPorFechaDto>(mapaGraficaUsuario.values());
		Collections.sort(listaData);

		List<Map<String, String>> data = new ArrayList<Map<String, String>>();
		for (GraficaPorFechaDto graficaPorFechaDto : listaData) {
			data.add(graficaPorFechaDto.getMapa());
		}

		String titulo = "Tareas desarrollador";
		String descripcion = "Representaci\u00f3n n\u00famero de tareas por estados";
		String tipoSerie = "line";
		String yDescripcion = "N Tareas";

		List<Map<String, String>> series = new ArrayList<Map<String, String>>();
		Map<String, String> serie1 = new HashMap<String, String>();
		serie1.put("dataField", "D");
		serie1.put("displayText", "Desarrollo");
		series.add(serie1);
		Map<String, String> serie2 = new HashMap<String, String>();
		serie2.put("dataField", "F");
		serie2.put("displayText", "Finalizada");
		series.add(serie2);
		Map<String, String> serie3 = new HashMap<String, String>();
		serie3.put("dataField", "T");
		serie3.put("displayText", "Test");
		series.add(serie3);

		/*
		 * 
		 * var data = [ { Date: '1/3/2011', Keith: 300, Erica: 150, George: 25
		 * }, { Date: '2/4/2011', Keith: 250, Erica: 250, George: 30 }, { Date:
		 * '3/5/2011', Keith: 300, Erica: 200, George: 25 }, { Date: '4/6/2011',
		 * Keith: 350, Erica: 250, George: 45 }, { Date: '5/7/2011', Keith: 200,
		 * Erica: 200, George: 25 }, { Date: '6/8/2011', Keith: 300, Erica: 200,
		 * George: 30 }, { Date: '7/9/2011', Keith: 600, Erica: 450, George: 90
		 * } ];
		 * 
		 * var series = [ { dataField: 'Keith', displayText: 'Pendiente' }, {
		 * dataField: 'Erica', displayText: 'Finalizado' } ]; var titulo =
		 * "Tareas desarrollador" var descripcion =
		 * "Representación número de tareas por estados"; var tipoSerie =
		 * "line"; var yDescripcion = "N Tareas";
		 */
		model.addAttribute(DATA, data);
		model.addAttribute(SERIES, series);
		model.addAttribute(TITULO, titulo);
		model.addAttribute(DESCRIPCION, descripcion);
		model.addAttribute(TIPOSERIE, tipoSerie);
		model.addAttribute(YDESCRIPCION, yDescripcion);

		return "graficas/graficaPorFecha";
	}
	
	@RequestMapping("/rendimientoUsuarioE")
	@Transactional
	public String rendimientoUsuarioE(ModelMap model,@RequestParam(required = false, value = "fDesde") String fDesde, @RequestParam(required = false, value = "fHasta") String fHasta) {



		UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
		List<Equipo> listaEquipos = userDetails.getListaEquipos();
		List<Integer> listaEquipoId = new ArrayList<Integer>();


		// Numero de tareas pendiente
		for (Equipo equipo : listaEquipos) {
			listaEquipoId.add(equipo.getId());
		}

		List<Integer> listaUsuarioId = equipoDao.usuariosXEquipo(listaEquipoId);
		List<Usuario> listaUsuarios = new ArrayList<Usuario>();
		for (Integer usuarioId : listaUsuarioId) {
			Usuario usuarioItem = new Usuario();
			usuarioItem.setId(usuarioId);
			listaUsuarios.add(usuarioItem);
		}


		
		
		Map<String, GraficaPorFechaDto> mapaGraficaUsuario = new HashMap<String, GraficaPorFechaDto>();
		
		if (fDesde != null && !fDesde.isEmpty()){
			
			Date fDesdeDate;
			Date fHastaDate;

			try {
				if (fDesde != null && !fDesde.isEmpty()) {
					fDesdeDate = new SimpleDateFormat("dd/MM/yyyy").parse(fDesde);
				} else {
					fDesdeDate = null;
				}
				if (fHasta != null && !fHasta.isEmpty()) {
					fHastaDate = new SimpleDateFormat("dd/MM/yyyy").parse(fHasta);
				} else {
					fHastaDate = null;
				}

			} catch (ParseException e) {
				e.printStackTrace();
				fDesdeDate = null;
				fHastaDate = null;
			}
			
			mapaGraficaUsuario = tareaDao.getTareaParaGraficaIntervalo(listaUsuarios,fDesdeDate,fHastaDate);
		}else{
			mapaGraficaUsuario = tareaDao.getTareaParaGrafica(listaUsuarios);
		}
		
		List<GraficaPorFechaDto> listaData = new ArrayList<GraficaPorFechaDto>(mapaGraficaUsuario.values());
		Collections.sort(listaData);

		List<Map<String, String>> data = new ArrayList<Map<String, String>>();
		for (GraficaPorFechaDto graficaPorFechaDto : listaData) {
			data.add(graficaPorFechaDto.getMapa());
		}

		String titulo = "Tareas Equipo/s";
		String descripcion = "Representaci\u00f3n n\u00famero de tareas por estados";
		String tipoSerie = "line";
		String yDescripcion = "N Tareas";

		List<Map<String, String>> series = new ArrayList<Map<String, String>>();
		Map<String, String> serie1 = new HashMap<String, String>();
		serie1.put("dataField", "D");
		serie1.put("displayText", "Desarrollo");
		series.add(serie1);
		Map<String, String> serie2 = new HashMap<String, String>();
		serie2.put("dataField", "F");
		serie2.put("displayText", "Finalizada");
		series.add(serie2);
		Map<String, String> serie3 = new HashMap<String, String>();
		serie3.put("dataField", "T");
		serie3.put("displayText", "Test");
		series.add(serie3);

		/*
		 * 
		 * var data = [ { Date: '1/3/2011', Keith: 300, Erica: 150, George: 25
		 * }, { Date: '2/4/2011', Keith: 250, Erica: 250, George: 30 }, { Date:
		 * '3/5/2011', Keith: 300, Erica: 200, George: 25 }, { Date: '4/6/2011',
		 * Keith: 350, Erica: 250, George: 45 }, { Date: '5/7/2011', Keith: 200,
		 * Erica: 200, George: 25 }, { Date: '6/8/2011', Keith: 300, Erica: 200,
		 * George: 30 }, { Date: '7/9/2011', Keith: 600, Erica: 450, George: 90
		 * } ];
		 * 
		 * var series = [ { dataField: 'Keith', displayText: 'Pendiente' }, {
		 * dataField: 'Erica', displayText: 'Finalizado' } ]; var titulo =
		 * "Tareas desarrollador" var descripcion =
		 * "Representación número de tareas por estados"; var tipoSerie =
		 * "line"; var yDescripcion = "N Tareas";
		 */
		model.addAttribute(DATA, data);
		model.addAttribute(SERIES, series);
		model.addAttribute(TITULO, titulo);
		model.addAttribute(DESCRIPCION, descripcion);
		model.addAttribute(TIPOSERIE, tipoSerie);
		model.addAttribute(YDESCRIPCION, yDescripcion);

		return "graficas/graficaPorFecha";
	}


}